﻿using System;

namespace ADV_Evaluator.Command {

    /// <summary>
    /// 「ループ」コマンドの属性値
    /// </summary>
    [Serializable]
    public struct LoopParams : ICommandParams {

        /// <summary>
        /// ループの終了条件付きならtrue
        /// </summary>
        public bool HasCondition;
        /// <summary>
        /// 終了条件における、比較対象の変数名（左辺）
        /// </summary>
        public string VariableName;
        /// <summary>
        /// 終了条件における、比較演算子
        /// </summary>
        public string Operator;
        /// <summary>
        /// 終了条件における、変数と比較する値（右辺）
        /// </summary>
        public int Value;

        /// <summary>
        /// 値を条件式に当てはめたとき、条件式が真かどうか確かめる。
        /// </summary>
        /// <param name="v">条件式の左辺となる値（変数）</param>
        /// <returns>条件式を評価した値</returns>
        public bool CheckCondition(int v) {
            if (!HasCondition) {
                return false;
            }
            switch (Operator) {
            case "==":
                return (v == Value);
            case "!=":
                return (v != Value);
            case ">":
                return (v > Value);
            case ">=":
                return (v >= Value);
            case "<":
                return (v < Value);
            case "<=":
                return (v <= Value);
            default:
                return false;
            }
        }

    }

}
